package controllers

import (
	"encoding/json"
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/mvc"
	"github.com/kataras/iris/v12/sessions"
	"iris_product/datamodels"
	"iris_product/rabbitmq"
	"iris_product/services"
	"os"
	"path/filepath"
	"strconv"
	"text/template"
)

type ProductController struct {
	Ctx iris.Context
	ProductService services.IProductService
	OrderService   services.IOrderService
	RabbitMQ *rabbitmq.RabbitMQ
	Session sessions.Session
}

func (p *ProductController) GetDetail() mvc.View {
	// 这里把秒杀商品写死了
	product, err := p.ProductService.GetProductByID(1)
	if err != nil {
		p.Ctx.Application().Logger().Error(err)
	}

	return mvc.View{
		Layout: "shared/productLayout.html",
		Name:   "product/view.html",
		Data: iris.Map{
			"product": product,
		},
	}
}

var (
	// 生成html保存目录
	htmlOutPath = "./fronted/web/htmlProductShow/"
	// 静态文件模板目录
	templatePath = "./fronted/web/views/template/"
)

func (p *ProductController) GetGenerateHtml() {
	productString := p.Ctx.URLParam("productID")
	productID, err := strconv.Atoi(productString)
	if err != nil {
		p.Ctx.Application().Logger().Debug(err)
	}
	////1.获取模板文件地址
	contentTmp,err := template.ParseFiles(filepath.Join(templatePath,"product.html"))
	if err != nil{
		p.Ctx.Application().Logger().Debug(err)
	}
	//2.获取html生成路径
	fileName := filepath.Join(htmlOutPath,"htmlProduct.html")

	//3.获取模板渲染数据
	product,err:=p.ProductService.GetProductByID(int64(productID))
	if err != nil{
		p.Ctx.Application().Logger().Debug(err)
	}
	//4.生成静态文件
	generateStaticHtml(p.Ctx,contentTmp,fileName,product)
}

// 生成html静态文件
func generateStaticHtml(ctx iris.Context, template *template.Template, fileName string, product *datamodels.Product){
	// 1.判断静态文件是否存在
	if Exist(fileName) {
		err := os.Remove(fileName)
		if err != nil{
			ctx.Application().Logger().Error(err)
		}
	}

	// 2.生成静态文件
	file,err := os.OpenFile(fileName,os.O_CREATE|os.O_WRONLY,os.ModePerm)
	if err != nil{
		ctx.Application().Logger().Error(err)
	}
	defer file.Close()
	template.Execute(file,&product)
}

// 判断文件是否存在
func Exist(fileName string) bool {
	_, err := os.Stat(fileName)
	return err==nil || os.IsExist(err)
}

func (p *ProductController) GetOrder() []byte {
	// 获取URL中的productID并赋值到程序中
	productString := p.Ctx.URLParam("productID")
	userString := p.Ctx.GetCookie("uid")
	productID, err := strconv.ParseInt(productString,10,64)
	if err != nil {
		p.Ctx.Application().Logger().Debug(err)
	}
	userID,err := strconv.ParseInt(userString,10,64)
	if err != nil {
		p.Ctx.Application().Logger().Debug(err)
	}
	// 创建消息体
	message := datamodels.Message{userID,productID}
	// 类型转化
	byteMessage,err := json.Marshal(message)
	if err != nil {
		p.Ctx.Application().Logger().Debug(err)
	}

	err = p.RabbitMQ.PublishSimple(string(byteMessage))
	if err != nil {
		p.Ctx.Application().Logger().Debug(err)
	}
	return []byte("true")
}
